package controlador;

import vista.InterfazGraficaReporteIngrediente;
import java.awt.event.ActionEvent;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.event.ActionListener;
import vista.Mensaje;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
import modelo.IngredienteDao;
import modelo.IngredienteProducto;
import modelo.Ingrediente;
import modelo.Venta;

public class ControladorReporteIngrediente implements ActionListener,WindowListener,ItemListener
{
	private InterfazGraficaReporteIngrediente interfazGrafica;
	private ControladorPrincipal controladorPrincipal;
	private List<Ingrediente> ingredientes;
	
	public ControladorReporteIngrediente(ControladorPrincipal controladorPrincipal)
	{
		this.controladorPrincipal= controladorPrincipal;
		
		interfazGrafica= new InterfazGraficaReporteIngrediente();
		
		ingredientes= new ArrayList<Ingrediente>();
		
		interfazGrafica.addListener((WindowListener) this);
		interfazGrafica.addListener((ActionListener) this);
		interfazGrafica.addListener((ItemListener) this);
		interfazGrafica.visualizarVentana();
	}
	

	@Override
	public void windowActivated(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowClosed(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowClosing(WindowEvent arg0) {
		interfazGrafica.descargarMemoria();
		controladorPrincipal.visualizarVentanaPrincipal();
		
	}

	@Override
	public void windowDeactivated(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowDeiconified(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowIconified(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowOpened(WindowEvent arg0) 
	{
		cargarTabla();
		
	}

	@Override
	public void actionPerformed(ActionEvent evt) 
	{
		if (evt.getActionCommand().equalsIgnoreCase("Guardar"))
		{
			if (ingredientes!=null && !ingredientes.isEmpty())
			{
				 JFileChooser fc= new JFileChooser();
	             fc.setFileFilter(new FileNameExtensionFilter(".txt","txt"));
	             File archivo= new File("ReporteIngredientes.txt");
	             
	             fc.setSelectedFile(archivo);
	
	             if (fc.showSaveDialog(null)== JFileChooser.APPROVE_OPTION)
	             {
	                     archivo = fc.getSelectedFile();
	
	                     /*Para que siempre se coloque la extension .txt*/
	                   if (!archivo.getAbsolutePath().contains(".txt"))
	                        archivo= new File(archivo.getAbsolutePath() + ".txt");
	                    
	                   try
	                   {  
	                	   new ControladorGuardarReporte<Ingrediente>(interfazGrafica.getVentana(),archivo,ingredientes,"Reporte Ingredientes");
	                   }
	                   catch(Exception e)
	                   {
	                	   Mensaje.mostrarError("Error Guardando Reporte!"); 
	                   }
	
	             }
			}
			else
				Mensaje.mostrarInformacion("No Existen Ingredientes!");
		}
		else if (evt.getActionCommand().equalsIgnoreCase("Salir"))
		{
			controladorPrincipal.visualizarVentanaPrincipal();
			interfazGrafica.descargarMemoria();
		}	
	}

	private int calcularTamanio()
	{
		int cantidad= ingredientes.size();
		
		for (Ingrediente ingrediente:ingredientes)
		{
			cantidad += ingrediente.getCalcularNroProducto() + 1;
		}
		
		return cantidad;
	}
	
    private void cargarTabla()
    {
    	try
    	{
    		TableModel modeloTabla= new DefaultTableModel();
    		IngredienteDao ingredienteDao= new IngredienteDao();
    	
    		
    		if (interfazGrafica.indiceSeleccionado()==0)
    		{
    			while (ingredientes.size()!=ingredienteDao.consultarIngredientesActivos().size())
    			{
    				new ControladorCargar<Ingrediente>(ingredientes,interfazGrafica.getVentana(),new modelo.IngredienteProductoDaoSwingWorker());
    			}
    			
    			java.util.Collections.sort(ingredientes, new Ingrediente.ComparadorCantidadAsc());
    		}
    		else if (interfazGrafica.indiceSeleccionado()==1)
    		{
    			while (ingredientes.size()!=ingredienteDao.consultarIngredientesActivos().size())
    			{
    				new ControladorCargar<Ingrediente>(ingredientes,interfazGrafica.getVentana(),new modelo.IngredienteProductoDaoSwingWorker());
    			}
    			
    			java.util.Collections.sort(ingredientes, new Ingrediente.ComparadorCantidadDesc());
    		}
    		
    		Object[] encabezados= {"","","",""};
    		Object data[][]= new Object[calcularTamanio()][encabezados.length];
    		IngredienteProducto ingProducto=null;
    		
    		int i=0;
    		for (Ingrediente ingrediente:ingredientes)
    		{
    			 data[i][0] = ingrediente.getCodigo();
    			 data[i][1] = ingrediente.getNombreCorto();
    			 
    			 Iterator<IngredienteProducto> itIngProducto= ingrediente.getIterador();
    			 
    			 while (itIngProducto.hasNext())
    			 { 
    				 ingProducto= itIngProducto.next();
    				 data[++i][1]= ingProducto.getProducto().getCodigo();
    				 data[i][2]= ingProducto.getProducto().getNombreCorto();
    				 data[i][3]= ingProducto.getCantidad();
    			 }
    			 
    			 data[++i][1] = "Total";
    			 data[i][3] = ingrediente.cantidadUsada();
    			 ++i;
    		}
    		
    		modeloTabla= new ModeloTabla(data,encabezados);
    		interfazGrafica.asignarModeloTabla(modeloTabla);
    	}
    	catch(Exception e)
    	{
    		interfazGrafica.asignarModeloTabla(new DefaultTableModel());
			Mensaje.mostrarError("Error cargando Tabla!!!");
    	}
    }
	
	
	@Override
	public void itemStateChanged(ItemEvent evt) {

		if (evt.getSource() instanceof javax.swing.JComboBox)
		{
			cargarTabla();
		}
		
	}
	
	private class ModeloTabla extends DefaultTableModel
	{


		public ModeloTabla(Object[][] data, Object[] columnNames) {
			super(data, columnNames);
			
		}
	
		public boolean isCellEditable(int row,int col)
		{
			return false;
		}
		
	}
	

}
